﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using CANO.Data.DAOs.Compromisos;

namespace CANO.Data.DAOs
{
	public class EntrevistaDAO
	{
		public int EntrevistaID { get; set; }
		public DateTime Hora { get; set; }
		public int ContactoComprador { get; set; }
		public int ContactoVendedor { get; set; }
		public string ContactoCompradorDisplay { get; set; }
		public string ContactoVendedorDisplay { get; set; }
		public int Usuario { get; set; }
		public List<SeguimientoDAO> Seguimientos { get; set; }
		public string HoraDisplay { get; set; }
		public List<UsuarioDAO> CompartidoCon { get; set; }

		public int Create(int CurrentUser)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				Entrevista newEntrevista = new Entrevista();
				newEntrevista.Hora = this.Hora;
                if(this.ContactoComprador == 0)
				    newEntrevista.ContactoComprador = null;
                else
                    newEntrevista.ContactoComprador = this.ContactoComprador;
				newEntrevista.ContactoVendedor = this.ContactoVendedor;
				newEntrevista.Usuario = CurrentUser;

				context.Entrevistas.InsertOnSubmit(newEntrevista);
				context.SubmitChanges();

				return newEntrevista.EntrevistaID;
			}
		}

		public void Update()
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var entrevista =
					(from e in context.Entrevistas
					 where e.EntrevistaID == this.EntrevistaID
					 select e).Single();

				entrevista.Hora = this.Hora;
				entrevista.ContactoComprador = this.ContactoComprador;
				entrevista.ContactoVendedor = this.ContactoVendedor;

				context.SubmitChanges();
			}
		}

        public void Delete(int EntrevistaID)
        {
            using (dcCanoDataContext context = new dcCanoDataContext())
            {
                var entrevista =
                    (from e in context.Entrevistas
                     where e.EntrevistaID == this.EntrevistaID
                     select e).Single();

                entrevista.Status = 1; //Delete

                context.SubmitChanges();
            }
        }

		public List<EntrevistaDAO> GetAllByContact(int ContactID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				List<EntrevistaDAO> ListaEntrevistas = new List<EntrevistaDAO>();

				var entrevistas =
					from e in context.Entrevistas
                    where (e.ContactoComprador == ContactID || e.ContactoVendedor == ContactID) && e.Hora >= DateTime.Now && e.Status == null
					orderby e.Hora ascending
					select e;


				foreach (var item in entrevistas)
				{
					EntrevistaDAO entrevista = new EntrevistaDAO();
					entrevista.EntrevistaID = item.EntrevistaID;
					entrevista.ContactoComprador = (item.ContactoComprador.HasValue) ? item.ContactoComprador.Value : 0;
					entrevista.ContactoVendedor = item.ContactoVendedor;
					entrevista.Hora = item.Hora;
                    
                    if (item.ContactoComprador.HasValue)
                        entrevista.ContactoCompradorDisplay = new ContactoDAO().GetNameByID(item.ContactoComprador.Value);

					entrevista.ContactoVendedorDisplay = new ContactoDAO().GetNameByID(item.ContactoVendedor);
					entrevista.Usuario = item.Usuario.Value;
					entrevista.Seguimientos = new SeguimientoDAO().GetSeguimientosByEntrevista(item.EntrevistaID);
					entrevista.HoraDisplay = item.Hora.ToShortDateString() + " " + item.Hora.ToShortTimeString();
					entrevista.CompartidoCon = this.GetUsersByEntrevistaID(entrevista.EntrevistaID);
					ListaEntrevistas.Add(entrevista);
				}
				return ListaEntrevistas;
			}
		}

		public List<EntrevistaDAO> GetCurrentWeekManager()
		{
            List<EntrevistaDAO> ListaEntrevistas = new List<EntrevistaDAO>();

            try
            {
                using (dcCanoDataContext context = new dcCanoDataContext())
                {

                    DateTime currentDay = DateTime.Now.Date;
                    DateTime stratDay = currentDay;
                    DateTime endDay = currentDay.AddDays(7);

                    //var entrevistas =
                    //    from e in context.Entrevistas
                    //    where (e.Hora >= stratDay && e.Hora <= endDay) && e.Status == null
                    //    orderby e.Hora ascending
                    //    select e;

                    var entrevistas = context.sp_getEntrevistasCurrentWeekGerencial();

                    foreach (var item in entrevistas)
                    {
                        EntrevistaDAO entrevista = new EntrevistaDAO();
                        entrevista.EntrevistaID = item.EntrevistaID;
                        entrevista.ContactoComprador = (item.ContactoComprador.HasValue) ? item.ContactoComprador.Value : 0;
                        entrevista.ContactoVendedor = item.ContactoVendedor;
                        entrevista.Hora = item.Hora;
                        if (item.ContactoComprador.HasValue)
                            entrevista.ContactoCompradorDisplay = new ContactoDAO().GetNameByID(item.ContactoComprador.Value);

                        entrevista.ContactoVendedorDisplay = new ContactoDAO().GetNameByID(item.ContactoVendedor);
                        entrevista.Usuario = item.Usuario.Value;
                        entrevista.CompartidoCon = this.GetUsersByEntrevistaID(entrevista.EntrevistaID);
                        ListaEntrevistas.Add(entrevista);
                    }
                    return ListaEntrevistas;
                }
            }
            catch (Exception)
            {
                return ListaEntrevistas;
            }
			
		}

		public EntrevistaDAO GetEntrevistaByID(int CompromisoID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				var entrevistas =
					from e in context.Entrevistas
                    where (e.EntrevistaID == CompromisoID && e.Status == null )
					select e;

				var item = entrevistas.SingleOrDefault();

					EntrevistaDAO entrevista = new EntrevistaDAO();
					entrevista.EntrevistaID = item.EntrevistaID;
                    entrevista.ContactoComprador = (item.ContactoComprador.HasValue) ? item.ContactoComprador.Value : 0;
					entrevista.ContactoVendedor = item.ContactoVendedor;
					entrevista.Hora = item.Hora;
                    if(item.ContactoComprador.HasValue)
					    entrevista.ContactoCompradorDisplay = new ContactoDAO().GetNameByID(item.ContactoComprador.Value);
					entrevista.ContactoVendedorDisplay = new ContactoDAO().GetNameByID(item.ContactoVendedor);
					entrevista.Usuario = item.Usuario.Value;
					entrevista.CompartidoCon = this.GetUsersByEntrevistaID(entrevista.EntrevistaID);
					return entrevista;
			}
		}

		internal List<EntrevistaDAO> GetCurrentWeekByUser(int UserID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				List<EntrevistaDAO> ListaEntrevistas = new List<EntrevistaDAO>();

				DateTime currentDay = DateTime.Now.Date;
				DateTime stratDay = currentDay;
				DateTime endDay = currentDay.AddDays(7);

                //var entrevistas =
                //    from e in context.Entrevistas
                //    where (e.Hora >= stratDay && e.Hora <= endDay) && (e.Usuario == UserID) && e.Status == null
                //    orderby e.Hora ascending
                //    select e;

                var entrevistas = context.sp_getEntrevistasCurrentWeekByUserId(UserID);

				foreach (var item in entrevistas)
				{
					EntrevistaDAO entrevista = new EntrevistaDAO();
					entrevista.EntrevistaID = item.EntrevistaID;
					entrevista.ContactoComprador = (item.ContactoComprador.HasValue) ? item.ContactoComprador.Value : 0;
					entrevista.ContactoVendedor = item.ContactoVendedor;
					entrevista.Hora = item.Hora;
                    if (item.ContactoComprador.HasValue)
                        entrevista.ContactoCompradorDisplay = new ContactoDAO().GetNameByID(item.ContactoComprador.Value);
					entrevista.ContactoVendedorDisplay = new ContactoDAO().GetNameByID(item.ContactoVendedor);
					entrevista.Usuario = item.Usuario.Value;
					entrevista.CompartidoCon = this.GetUsersByEntrevistaID(entrevista.EntrevistaID);
					ListaEntrevistas.Add(entrevista);
				}
				return ListaEntrevistas;
			}
		}

		public List<UsuarioDAO> GetUsersByEntrevistaID(int EntrevistaID)
		{
			using (dcCanoDataContext context = new dcCanoDataContext())
			{
				List<UsuarioDAO> listUser = new List<UsuarioDAO>();
				
					var entrevistas =
						from e in context.Entrevistas
						join cc in context.EntrevistaCompartidas on e.EntrevistaID equals cc.EntrevistaID
                        where (e.EntrevistaID == EntrevistaID || cc.EntrevistaID == EntrevistaID) && e.Status == null
						select new { e, cc };

					foreach (var item in entrevistas)
					{
						if (item.cc.UsuarioCompartido != null)
							listUser.Add(new UsuarioDAO().getUser(item.cc.UsuarioCompartido));
						else
							listUser.Add(new UsuarioDAO().getUser(item.e.Usuario.Value));
					}


				return listUser;
			}
		}
	}
}
